import 'dart:math';

/// 医疗相关的Mock数据API
class MedicalMockApis {
  static final Random _random = Random();

  // 模拟用户数据
  static final List<Map<String, dynamic>> _mockUsers = [
    {
      'id': '1',
      'username': 'admin',
      'password': '123456',
      'phone': '13800138001',
      'name': '张医生',
      'avatar': 'https://via.placeholder.com/100x100',
      'department': '内科',
      'title': '主任医师',
      'hospital': '北京协和医院',
      'createTime': '2023-01-01 10:00:00',
    },
    {
      'id': '2',
      'username': 'doctor1',
      'password': '123456',
      'phone': '13800138002',
      'name': '李医生',
      'avatar': 'https://via.placeholder.com/100x100',
      'department': '外科',
      'title': '副主任医师',
      'hospital': '北京协和医院',
      'createTime': '2023-01-02 10:00:00',
    },
  ];

  /// 用户登录
  static Future<Map<String, dynamic>> loginUser({
    required String username,
    required String password,
  }) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 500 + _random.nextInt(1000)));

    final user = _mockUsers.firstWhere(
      (u) => u['username'] == username && u['password'] == password,
      orElse: () => {},
    );

    if (user.isNotEmpty) {
      return {
        'code': 200,
        'message': '登录成功',
        'data': {
          'token': 'mock_token_${DateTime.now().millisecondsSinceEpoch}',
          'userInfo': {
            'id': user['id'],
            'username': user['username'],
            'name': user['name'],
            'avatar': user['avatar'],
            'department': user['department'],
            'title': user['title'],
            'hospital': user['hospital'],
            'phone': user['phone'],
          },
        },
      };
    } else {
      return {
        'code': 400,
        'message': '用户名或密码错误',
        'data': null,
      };
    }
  }

  /// 用户注册
  static Future<Map<String, dynamic>> registerUser({
    required String username,
    required String password,
    required String phone,
  }) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 500 + _random.nextInt(1000)));

    // 检查用户名是否已存在
    final existingUser = _mockUsers.firstWhere(
      (u) => u['username'] == username,
      orElse: () => {},
    );

    if (existingUser.isNotEmpty) {
      return {
        'code': 400,
        'message': '用户名已存在',
        'data': null,
      };
    }

    // 添加新用户
    final newUser = {
      'id': (_mockUsers.length + 1).toString(),
      'username': username,
      'password': password,
      'phone': phone,
      'name': '新医生',
      'avatar': 'https://via.placeholder.com/100x100',
      'department': '全科',
      'title': '医师',
      'hospital': '北京协和医院',
      'createTime': DateTime.now().toString(),
    };
    _mockUsers.add(newUser);

    return {
      'code': 200,
      'message': '注册成功',
      'data': {
        'id': newUser['id'],
        'username': newUser['username'],
      },
    };
  }

  /// 获取工作台数据
  static Future<Map<String, dynamic>> getWorkbenchData() async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    return {
      'code': 200,
      'message': '获取成功',
      'data': {
        'todayPatients': 28,
        'todayPrescriptions': 15,
        'pendingOrders': 6,
        'totalRevenue': 12580.50,
        'recentPatients': [
          {
            'id': '1',
            'name': '王小明',
            'age': 35,
            'gender': '男',
            'phone': '13800138001',
            'visitTime': '2024-01-15 09:30:00',
            'diagnosis': '感冒',
            'status': '已就诊',
          },
          {
            'id': '2',
            'name': '李小红',
            'age': 28,
            'gender': '女',
            'phone': '13800138002',
            'visitTime': '2024-01-15 10:15:00',
            'diagnosis': '头痛',
            'status': '待就诊',
          },
          {
            'id': '3',
            'name': '张大华',
            'age': 45,
            'gender': '男',
            'phone': '13800138003',
            'visitTime': '2024-01-15 11:00:00',
            'diagnosis': '高血压复查',
            'status': '已就诊',
          },
        ],
        'quickActions': [
          {'title': '新增患者', 'icon': 'person_add', 'route': '/patient/add'},
          {'title': '开处方', 'icon': 'receipt', 'route': '/prescription/add'},
          {'title': '查看订单', 'icon': 'shopping_cart', 'route': '/order/list'},
          {'title': '库存管理', 'icon': 'inventory', 'route': '/inventory'},
        ],
      },
    };
  }

  /// 获取患者列表
  static Future<Map<String, dynamic>> getPatientList({
    int page = 1,
    int pageSize = 20,
    String? keyword,
  }) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    final allPatients = [
      {
        'id': '1',
        'name': '王小明',
        'age': 35,
        'gender': '男',
        'phone': '13800138001',
        'idCard': '110101198901011234',
        'address': '北京市朝阳区建国路1号',
        'emergencyContact': '李小红',
        'emergencyPhone': '13800138002',
        'medicalHistory': '高血压病史3年',
        'allergies': '青霉素过敏',
        'lastVisit': '2024-01-15 09:30:00',
        'totalVisits': 15,
        'status': '正常',
      },
      {
        'id': '2',
        'name': '李小红',
        'age': 28,
        'gender': '女',
        'phone': '13800138002',
        'idCard': '110101199601011234',
        'address': '北京市海淀区中关村大街1号',
        'emergencyContact': '王小明',
        'emergencyPhone': '13800138001',
        'medicalHistory': '无特殊病史',
        'allergies': '无已知过敏',
        'lastVisit': '2024-01-15 10:15:00',
        'totalVisits': 8,
        'status': '正常',
      },
      {
        'id': '3',
        'name': '张大华',
        'age': 45,
        'gender': '男',
        'phone': '13800138003',
        'idCard': '110101197901011234',
        'address': '北京市西城区西单大街1号',
        'emergencyContact': '张小丽',
        'emergencyPhone': '13800138004',
        'medicalHistory': '糖尿病病史5年，高血压病史2年',
        'allergies': '磺胺类药物过敏',
        'lastVisit': '2024-01-15 11:00:00',
        'totalVisits': 25,
        'status': '慢性病',
      },
      {
        'id': '4',
        'name': '赵小芳',
        'age': 32,
        'gender': '女',
        'phone': '13800138004',
        'idCard': '110101199201011234',
        'address': '北京市东城区王府井大街1号',
        'emergencyContact': '赵大明',
        'emergencyPhone': '13800138005',
        'medicalHistory': '甲状腺功能亢进病史1年',
        'allergies': '无已知过敏',
        'lastVisit': '2024-01-14 14:30:00',
        'totalVisits': 12,
        'status': '正常',
      },
      {
        'id': '5',
        'name': '孙小军',
        'age': 55,
        'gender': '男',
        'phone': '13800138005',
        'idCard': '110101196901011234',
        'address': '北京市丰台区丰台路1号',
        'emergencyContact': '孙小花',
        'emergencyPhone': '13800138006',
        'medicalHistory': '冠心病病史8年，高血脂病史10年',
        'allergies': '阿司匹林过敏',
        'lastVisit': '2024-01-14 16:00:00',
        'totalVisits': 35,
        'status': '慢性病',
      },
    ];

    // 如果有搜索关键词，进行过滤
    List<Map<String, dynamic>> filteredPatients = allPatients;
    if (keyword != null && keyword.isNotEmpty) {
      filteredPatients = allPatients.where((patient) {
        return patient['name'].toString().contains(keyword) ||
            patient['phone'].toString().contains(keyword) ||
            patient['idCard'].toString().contains(keyword);
      }).toList();
    }

    // 分页处理
    final startIndex = (page - 1) * pageSize;
    final endIndex = startIndex + pageSize;
    final paginatedPatients = filteredPatients.sublist(
      startIndex,
      endIndex > filteredPatients.length ? filteredPatients.length : endIndex,
    );

    return {
      'code': 200,
      'message': '获取成功',
      'data': {
        'list': paginatedPatients,
        'total': filteredPatients.length,
        'page': page,
        'pageSize': pageSize,
        'totalPages': (filteredPatients.length / pageSize).ceil(),
      },
    };
  }

  /// 获取处方列表
  static Future<Map<String, dynamic>> getPrescriptionList({
    int page = 1,
    int pageSize = 20,
    String? patientId,
  }) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    final allPrescriptions = [
      {
        'id': '1',
        'prescriptionNo': 'CF202401150001',
        'patientId': '1',
        'patientName': '王小明',
        'doctorId': '1',
        'doctorName': '张医生',
        'diagnosis': '感冒',
        'symptoms': '发热、咳嗽、流鼻涕',
        'medicines': [
          {
            'id': '1',
            'name': '阿莫西林胶囊',
            'specification': '0.25g*24粒',
            'dosage': '每次2粒',
            'frequency': '每日3次',
            'duration': '7天',
            'quantity': 2,
            'unit': '盒',
            'price': 15.80,
          },
          {
            'id': '2',
            'name': '复方甘草片',
            'specification': '50片/瓶',
            'dosage': '每次2片',
            'frequency': '每日3次',
            'duration': '5天',
            'quantity': 1,
            'unit': '瓶',
            'price': 8.50,
          },
        ],
        'totalAmount': 24.30,
        'status': '已开具',
        'createTime': '2024-01-15 09:45:00',
        'remark': '注意休息，多喝水',
      },
      {
        'id': '2',
        'prescriptionNo': 'CF202401150002',
        'patientId': '2',
        'patientName': '李小红',
        'doctorId': '1',
        'doctorName': '张医生',
        'diagnosis': '偏头痛',
        'symptoms': '头痛、恶心',
        'medicines': [
          {
            'id': '3',
            'name': '布洛芬缓释胶囊',
            'specification': '0.3g*20粒',
            'dosage': '每次1粒',
            'frequency': '每日2次',
            'duration': '3天',
            'quantity': 1,
            'unit': '盒',
            'price': 22.50,
          },
        ],
        'totalAmount': 22.50,
        'status': '已开具',
        'createTime': '2024-01-15 10:30:00',
        'remark': '避免熬夜，保持规律作息',
      },
      {
        'id': '3',
        'prescriptionNo': 'CF202401150003',
        'patientId': '3',
        'patientName': '张大华',
        'doctorId': '1',
        'doctorName': '张医生',
        'diagnosis': '高血压',
        'symptoms': '血压偏高',
        'medicines': [
          {
            'id': '4',
            'name': '硝苯地平缓释片',
            'specification': '20mg*30片',
            'dosage': '每次1片',
            'frequency': '每日1次',
            'duration': '30天',
            'quantity': 1,
            'unit': '盒',
            'price': 35.60,
          },
          {
            'id': '5',
            'name': '氢氯噻嗪片',
            'specification': '25mg*100片',
            'dosage': '每次1片',
            'frequency': '每日1次',
            'duration': '30天',
            'quantity': 1,
            'unit': '瓶',
            'price': 12.80,
          },
        ],
        'totalAmount': 48.40,
        'status': '已开具',
        'createTime': '2024-01-15 11:15:00',
        'remark': '定期监测血压，低盐饮食',
      },
    ];

    // 如果指定了患者ID，进行过滤
    List<Map<String, dynamic>> filteredPrescriptions = allPrescriptions;
    if (patientId != null && patientId.isNotEmpty) {
      filteredPrescriptions = allPrescriptions.where((prescription) {
        return prescription['patientId'] == patientId;
      }).toList();
    }

    // 分页处理
    final startIndex = (page - 1) * pageSize;
    final endIndex = startIndex + pageSize;
    final paginatedPrescriptions = filteredPrescriptions.sublist(
      startIndex,
      endIndex > filteredPrescriptions.length
          ? filteredPrescriptions.length
          : endIndex,
    );

    return {
      'code': 200,
      'message': '获取成功',
      'data': {
        'list': paginatedPrescriptions,
        'total': filteredPrescriptions.length,
        'page': page,
        'pageSize': pageSize,
        'totalPages': (filteredPrescriptions.length / pageSize).ceil(),
      },
    };
  }

  /// 获取采购商品列表
  static Future<Map<String, dynamic>> getPurchaseProductList({
    int page = 1,
    int pageSize = 20,
    String? category,
    String? keyword,
  }) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    final allProducts = [
      {
        'id': '1',
        'name': '阿莫西林胶囊',
        'specification': '0.25g*24粒',
        'manufacturer': '华北制药',
        'category': '抗生素',
        'price': 15.80,
        'stock': 150,
        'minStock': 50,
        'unit': '盒',
        'batchNo': '20240101',
        'expiryDate': '2026-01-01',
        'supplier': '华北制药销售有限公司',
        'status': '正常',
      },
      {
        'id': '2',
        'name': '复方甘草片',
        'specification': '50片/瓶',
        'manufacturer': '太极集团',
        'category': '止咳化痰',
        'price': 8.50,
        'stock': 80,
        'minStock': 30,
        'unit': '瓶',
        'batchNo': '20240102',
        'expiryDate': '2025-12-01',
        'supplier': '太极集团医药销售公司',
        'status': '正常',
      },
      {
        'id': '3',
        'name': '布洛芬缓释胶囊',
        'specification': '0.3g*20粒',
        'manufacturer': '中美史克',
        'category': '解热镇痛',
        'price': 22.50,
        'stock': 25,
        'minStock': 20,
        'unit': '盒',
        'batchNo': '20240103',
        'expiryDate': '2025-11-01',
        'supplier': '中美史克制药有限公司',
        'status': '库存不足',
      },
      {
        'id': '4',
        'name': '硝苯地平缓释片',
        'specification': '20mg*30片',
        'manufacturer': '拜耳',
        'category': '心血管用药',
        'price': 35.60,
        'stock': 60,
        'minStock': 25,
        'unit': '盒',
        'batchNo': '20240104',
        'expiryDate': '2026-06-01',
        'supplier': '拜耳医药保健有限公司',
        'status': '正常',
      },
      {
        'id': '5',
        'name': '氢氯噻嗪片',
        'specification': '25mg*100片',
        'manufacturer': '天津力生',
        'category': '心血管用药',
        'price': 12.80,
        'stock': 90,
        'minStock': 40,
        'unit': '瓶',
        'batchNo': '20240105',
        'expiryDate': '2025-10-01',
        'supplier': '天津力生制药股份有限公司',
        'status': '正常',
      },
    ];

    // 过滤处理
    List<Map<String, dynamic>> filteredProducts = allProducts;

    if (category != null && category.isNotEmpty) {
      filteredProducts = filteredProducts.where((product) {
        return product['category'] == category;
      }).toList();
    }

    if (keyword != null && keyword.isNotEmpty) {
      filteredProducts = filteredProducts.where((product) {
        return product['name'].toString().contains(keyword) ||
            product['manufacturer'].toString().contains(keyword) ||
            product['supplier'].toString().contains(keyword);
      }).toList();
    }

    // 分页处理
    final startIndex = (page - 1) * pageSize;
    final endIndex = startIndex + pageSize;
    final paginatedProducts = filteredProducts.sublist(
      startIndex,
      endIndex > filteredProducts.length ? filteredProducts.length : endIndex,
    );

    return {
      'code': 200,
      'message': '获取成功',
      'data': {
        'list': paginatedProducts,
        'total': filteredProducts.length,
        'page': page,
        'pageSize': pageSize,
        'totalPages': (filteredProducts.length / pageSize).ceil(),
        'categories': ['抗生素', '止咳化痰', '解热镇痛', '心血管用药', '消化系统用药'],
      },
    };
  }

  /// 获取采购订单列表
  static Future<Map<String, dynamic>> getPurchaseOrderList({
    int page = 1,
    int pageSize = 20,
    String? status,
  }) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    final allOrders = [
      {
        'id': '1',
        'orderNo': 'PO202401150001',
        'supplier': '华北制药销售有限公司',
        'totalAmount': 1580.00,
        'status': '待确认',
        'createTime': '2024-01-15 09:00:00',
        'expectedDelivery': '2024-01-20',
        'items': [
          {
            'productId': '1',
            'productName': '阿莫西林胶囊',
            'specification': '0.25g*24粒',
            'quantity': 100,
            'unit': '盒',
            'price': 15.80,
            'amount': 1580.00,
          },
        ],
        'remark': '紧急采购',
      },
      {
        'id': '2',
        'orderNo': 'PO202401140001',
        'supplier': '中美史克制药有限公司',
        'totalAmount': 2250.00,
        'status': '已确认',
        'createTime': '2024-01-14 14:30:00',
        'expectedDelivery': '2024-01-19',
        'items': [
          {
            'productId': '3',
            'productName': '布洛芬缓释胶囊',
            'specification': '0.3g*20粒',
            'quantity': 100,
            'unit': '盒',
            'price': 22.50,
            'amount': 2250.00,
          },
        ],
        'remark': '常规补货',
      },
      {
        'id': '3',
        'orderNo': 'PO202401130001',
        'supplier': '拜耳医药保健有限公司',
        'totalAmount': 3560.00,
        'status': '已发货',
        'createTime': '2024-01-13 10:15:00',
        'expectedDelivery': '2024-01-18',
        'actualDelivery': '2024-01-17',
        'items': [
          {
            'productId': '4',
            'productName': '硝苯地平缓释片',
            'specification': '20mg*30片',
            'quantity': 100,
            'unit': '盒',
            'price': 35.60,
            'amount': 3560.00,
          },
        ],
        'remark': '定期采购',
      },
      {
        'id': '4',
        'orderNo': 'PO202401120001',
        'supplier': '天津力生制药股份有限公司',
        'totalAmount': 1280.00,
        'status': '已完成',
        'createTime': '2024-01-12 16:00:00',
        'expectedDelivery': '2024-01-17',
        'actualDelivery': '2024-01-16',
        'items': [
          {
            'productId': '5',
            'productName': '氢氯噻嗪片',
            'specification': '25mg*100片',
            'quantity': 100,
            'unit': '瓶',
            'price': 12.80,
            'amount': 1280.00,
          },
        ],
        'remark': '库存补充',
      },
    ];

    // 状态过滤
    List<Map<String, dynamic>> filteredOrders = allOrders;
    if (status != null && status.isNotEmpty) {
      filteredOrders = allOrders.where((order) {
        return order['status'] == status;
      }).toList();
    }

    // 分页处理
    final startIndex = (page - 1) * pageSize;
    final endIndex = startIndex + pageSize;
    final paginatedOrders = filteredOrders.sublist(
      startIndex,
      endIndex > filteredOrders.length ? filteredOrders.length : endIndex,
    );

    return {
      'code': 200,
      'message': '获取成功',
      'data': {
        'list': paginatedOrders,
        'total': filteredOrders.length,
        'page': page,
        'pageSize': pageSize,
        'totalPages': (filteredOrders.length / pageSize).ceil(),
        'statusList': ['待确认', '已确认', '已发货', '已完成', '已取消'],
      },
    };
  }

  /// 获取地址列表
  static Future<Map<String, dynamic>> getAddressList() async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    final addresses = [
      {
        'id': '1',
        'name': '张医生',
        'phone': '13800138001',
        'province': '北京市',
        'city': '北京市',
        'district': '朝阳区',
        'address': '建国路1号协和医院',
        'isDefault': true,
        'createTime': '2024-01-01 10:00:00',
      },
      {
        'id': '2',
        'name': '李医生',
        'phone': '13800138002',
        'province': '北京市',
        'city': '北京市',
        'district': '海淀区',
        'address': '中关村大街1号',
        'isDefault': false,
        'createTime': '2024-01-02 10:00:00',
      },
      {
        'id': '3',
        'name': '王医生',
        'phone': '13800138003',
        'province': '上海市',
        'city': '上海市',
        'district': '浦东新区',
        'address': '陆家嘴金融中心',
        'isDefault': false,
        'createTime': '2024-01-03 10:00:00',
      },
    ];

    return {
      'code': 200,
      'message': '获取成功',
      'data': {
        'list': addresses,
        'total': addresses.length,
      },
    };
  }

  /// 添加地址
  static Future<Map<String, dynamic>> addAddress({
    required String name,
    required String phone,
    required String province,
    required String city,
    required String district,
    required String address,
    bool isDefault = false,
  }) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    return {
      'code': 200,
      'message': '添加成功',
      'data': {
        'id': DateTime.now().millisecondsSinceEpoch.toString(),
        'name': name,
        'phone': phone,
        'province': province,
        'city': city,
        'district': district,
        'address': address,
        'isDefault': isDefault,
        'createTime': DateTime.now().toString(),
      },
    };
  }

  /// 更新地址
  static Future<Map<String, dynamic>> updateAddress({
    required String id,
    required String name,
    required String phone,
    required String province,
    required String city,
    required String district,
    required String address,
    bool isDefault = false,
  }) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    return {
      'code': 200,
      'message': '更新成功',
      'data': {
        'id': id,
        'name': name,
        'phone': phone,
        'province': province,
        'city': city,
        'district': district,
        'address': address,
        'isDefault': isDefault,
        'updateTime': DateTime.now().toString(),
      },
    };
  }

  /// 删除地址
  static Future<Map<String, dynamic>> deleteAddress(String id) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    return {
      'code': 200,
      'message': '删除成功',
      'data': null,
    };
  }

  /// 设置默认地址
  static Future<Map<String, dynamic>> setDefaultAddress(String id) async {
    // 模拟网络延迟
    await Future.delayed(Duration(milliseconds: 300 + _random.nextInt(700)));

    return {
      'code': 200,
      'message': '设置成功',
      'data': null,
    };
  }
}
